<?php

/**
 * 数据库类
 */
class Model{

    public $table; //表名
    public static $db;    //数据库连接对象  使用静态变量访问只需访问一次 不用每次执行sql都要连一次数据库链接
    public $error; //错误信息
    public $errno; //错误代码
    public $where; //where条件

    function __construct($table=null){
    	if($table){
    		$this->table=$table;
    	}    

    	//判断是否有对象
    	if(!self::$db){
    		var_dump($table);
	        //初始化时就自动连接数据库
	    	try{
	    	self::$db = new PDO("mysql:host=".C('host').";dbname=".C('dbname').";charset=utf8",C('user'),C('password'));
		    }catch(PDOException $e){
		        echo "Error:".$e;exit;
		    }
	    }	
    }
     

    //删除数据
    // public function delete($where){
    // 	//拼字符串
    //     $sql = "delete from ".$this->table.' where '.$where;
    //     //执行才能实现删除
    //     //$res = $this->db->query($sql);
    //     $this->exec($sql);    
    // }

    //增加数据
    public function add($data){
    	// var_dump($data);
    	//取字符串字段,并以逗号分割
    	$str = implode(',',array_keys($data));
    	//取值  
    	$val = implode("','",$data);   
        // $sql = "insert into ".$this->table.'('.$s.') values ('.$v.')';  
        $sql = "insert into ".$this->table." (".$str.") values('".$val."')";
        // var_dump($sql);
        //执行
        $this->exec($sql);                      
    }

    //增、删、改都要执行一次，执行成功才返回结果，所以可以封装一个方法，每次执行sql语句调用一下
    
    /*
    *  exec  pdo执行的方法(增、删、改)
    */
    public function exec($sql){
   	    $res = self::$db->exec($sql);
        if(!$res){
       	   $this->error=self::$db->errorInfo()[2];
       	   $this->errno=self::$db->errorCode();
       	   return false;
        }
        return $res;
    }

    /*
    *query pdo的执行方法 (查询类的)
    */
    public  function query($sql){
        $res = self::$db->query($sql);
        if(!$res){
        	$this->error=self::$db->errorInfo()[2];
        	$this->errno=self::$db->errorCode();
        	return false;
        }
        return $res->fetchAll(PDO::FETCH_ASSOC); //注意这里PDO的写法
    }

    /*
    *  where   加条件执行
    */
    
    public function where($where){
    	$this->where=" where ".$where;
    	return $this;

    }

    /*
    *  find   查询功能
    */
    
    public function find(){
        $res = "select * from ".$this->table.$this->where;
        // var_dump($res);die;
        return $this->query($res);
    }

    /*
    *  getError 获取错误信息的方法
    */
    
    public function getError(){
    	return '错误代码：'.$this->errno.'错误代码：'.$this->error;
    }

    /*
    * save 更新功能
    */
   
    public function save($data){
    	$str = '';
    	foreach ($data as $key => $value) {
    		$str .= $key."='".$value."',";    //这样拼接字符串最后一个多了逗号，需要切割掉
    	}
    	$str = rtrim($str,',');
    	$res = " update ".$this->table." set ".$str .$this->where;//拼字符串时注意空格 不能连一起
    	//执行
        var_dump($res);
    	return $this->exec($res);
    }



    /*
    * delete 删除功能
    */
    
    public  function delete($id=null){
    	//获取主键
    	$key=$this->getPri();
    	//因为要删除的数据不知道主键是不是id   所以要获取到主键才能删除对应的数据
    	//判断
    	if($id){
    		//找到直接删除
    		$res = "delete from ".$this->table." where ".$key.'='.$id;
    	}else{
    		//否则通过条件去找到主键
    		$res = "select from ".$this->table.$this->where;
    	}

    	//执行
    	return $this->exec($res);

    }

    /*
    * getPri  获取主键的方法
    */
   
    public function getPri(){
    	//显示表结构   找到key对应的值为PRI  对应的那个Id 就是主键
    	$sql = "desc ".$this->table;  //找到student
    	$res = $this->query($sql);    //找到PRI
    	var_dump($res);
    	//循环取出主键
    	foreach ($res as $k => $val){
    		if($val['Key']=='PRI'){   			
    			return $val['Field']; //返回主键对应的id
    		}
    	}
    }




}





























































